﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using SIM.Geo.BE;
using System.Data;

namespace SIM.Geo.DA
{
    public class DAAvanceDiario : Base
    {
        #region Metodos
        /// <summary>
        /// Método que devuelve la lista de AvanceDiario
        /// </summary>
        /// <returns></returns>
        public List<AvanceDiario> ListarAvanceDiario()
        {
            return this.Context.AvanceDiario.ToList();
        }
        /// <summary>
        /// Método para insertar una AvanceDiario
        /// </summary>
        /// <param name="AvanceDiario"></param>
        /// <returns></returns>
        public int InsertarAvanceDiario(AvanceDiario avanceDiario)
        {
            this.Context.AvanceDiario.AddObject(avanceDiario);
            this.Context.SaveChanges();
            return avanceDiario.CodigoAvanceDiario;

        }
        /// <summary>
        /// Método para modificar un AvanceDiario
        /// </summary>
        /// <param name="AvanceDiario"></param>
        public void ModificarAvanceDiario(AvanceDiario avanceDiario)
        {
            this.Context.AvanceDiario.Attach(avanceDiario);
            this.Context.ObjectStateManager.ChangeObjectState(avanceDiario, EntityState.Modified);

            //Agrega Avance Diario
            foreach (var item in avanceDiario.AvanceDiarioSonsajes)
            {
                this.Context.ObjectStateManager.ChangeObjectState(item, EntityState.Added);

                //Detalle perforacion
                foreach (var detalle in item.DetallePerforacion)
                {
                    this.Context.ObjectStateManager.ChangeObjectState(detalle, EntityState.Added);
                }
            }

            //Agrega Consumo
            foreach (var item in avanceDiario.Consumo)
            {
                this.Context.ObjectStateManager.ChangeObjectState(item, EntityState.Added);
            }

            //Agrega Entubacion
            foreach (var item in avanceDiario.Entubacion)
            {
                this.Context.ObjectStateManager.ChangeObjectState(item, EntityState.Added);
            }

            //Agrega Diatribucion
            foreach (var item in avanceDiario.DistribucionTrabajo)
            {
                this.Context.ObjectStateManager.ChangeObjectState(item, EntityState.Added);
            }
            this.Context.SaveChanges();
        }
        /// <summary>
        /// Método para eliminar AvanceDiario
        /// </summary>
        /// <param name="AvanceDiario"></param>
        public void EliminarAvanceDiario(int codigoAvanceDiario)
        {
            //this.Context.AvanceDiario.DeleteObject(avanceDiario);
            //this.Context.SaveChanges();
            this.Context.eliminarAvanceDiario(codigoAvanceDiario);
        }

        /// <summary>
        /// Método que devuelve AvanceDiario por codigo
        /// </summary>
        /// <param name="codigoAvanceDiario"></param>
        /// <returns></returns>
        public AvanceDiario ObtenerAvanceDiario(int codigoAvanceDiario)
        {
            return this.Context.AvanceDiario.Where(x => x.CodigoAvanceDiario.Equals(codigoAvanceDiario)).FirstOrDefault();
        }

        /// <summary>
        /// Método que devuelve lista de AvanceDiario
        /// </summary>
        /// <param name="codigoAvanceDiario"></param>
        /// <returns></returns>
        public List<buscarAvanceDiario_Result> BuscarAvanceDiario(int codigoEmpresa, int codigoMaquina, string anio, string mes)
        {
            return this.Context.buscarAvanceDiario(codigoEmpresa, codigoMaquina, anio, mes).ToList();
        }

        /// <summary>
        /// Genera Codigo de Avance Diario
        /// </summary>
        /// <param name="anio"></param>
        /// <param name="mes"></param>
        /// <param name="codigoMaquina"></param>
        /// <returns></returns>
        public int GenerarCodigoAvanceDiario(string anio, string mes)
        {
            return (int)this.Context.generarCodigoAvanceDiario(anio, mes).FirstOrDefault();

        }

        /// <summary>
        /// Obtiene ultimo codigo de sondaje utilizado por Maquina
        /// </summary>
        /// <param name="anio"></param>
        /// <param name="mes"></param>
        /// <param name="codigoMaquina"></param>
        /// <returns></returns>
        public int ObtenerUltimoCodSondajeADiarioMaquina(int codigoMaquina)
        {
            return (int)this.Context.obtenerCodigoSondajeADiarioMaquina(codigoMaquina).FirstOrDefault();

        }

        /// <summary>
        /// Obtiene ultimo Avance diario
        /// </summary>
        /// <param name="anio"></param>
        /// <param name="mes"></param>
        /// <param name="codigoMaquina"></param>
        /// <returns></returns>
        public obtenerUltimoAvanceMaquina_Result ObtenerUltimoAvanceMaquina(int codigoMaquina)
        {
            return this.Context.obtenerUltimoAvanceMaquina(codigoMaquina).FirstOrDefault();

        }

        /// <summary>
        /// Retorna la lista de AvanceDiario por Codigo
        /// </summary>
        /// <param name="anio"></param>
        /// <param name="mes"></param>
        /// <param name="codigoMaquina"></param>
        /// <returns></returns>
        public List<repAvanceDiario_Result> ListarAvanceDiarioPorCodigo(int codigoAvanceDiario)
        {
            return this.Context.repAvanceDiario(codigoAvanceDiario).ToList();

        }
        /// <summary>
        /// Devuelve la lista detalle de perforacion por Avance Diario
        /// </summary>
        /// <param name="codigoAvanceDiario"></param>
        /// <returns></returns>
        public List<repAvanceDiarioDetallePerforacion_Result> ListarDetalleAvancePerforacionPorAvanceDiario(int codigoAvanceDiario)
        {
            return this.Context.repAvanceDiarioDetallePerforacion(codigoAvanceDiario).ToList();

        }
        /// <summary>
        /// Devuelve la lista avance sondaje detalle de perforacion por Avance Diario
        /// </summary>
        /// <param name="codigoAvanceDiario"></param>
        /// <returns></returns>
        public List<repAvanceDiarioSondaje_Result> ListarReporteAvanceDiarioSondaje(int codigoAvanceDiario)
        {
            return this.Context.repAvanceDiarioSondaje(codigoAvanceDiario).ToList();

        }

        /// <summary>
        /// Devuelve la lista de otras maquinas de lo indicado, que registro por perforista y fecha
        /// </summary>
        /// <param name="codigoPerforista"></param>
        /// <param name="codigoMaquina"></param>
        /// <param name="fecha"></param>
        /// <returns></returns>
        public List<AvanceDiario> ListarOtrasMaquinasPorPerforistaYFecha(string codigoPerforista, DateTime fecha, int codigoMaquina)
        {
            return this.Context.AvanceDiario.Where(x => x.CodigoPerforista.ToUpper().Trim().CompareTo(codigoPerforista.ToUpper().Trim()) == 0 && x.CodigoMaquina != codigoMaquina && x.Fecha.Year == fecha.Year && x.Fecha.Month == fecha.Month && x.Fecha.Day == fecha.Day).ToList();
        }
        #endregion
    }
}
